namespace SmartMathLibrary
{
    /// <summary>
    /// Interface to implement a Sedenion class.
    /// </summary>
    public interface ISedenion
    {
        /// <summary>
        /// Gets or sets the real number part of the sedenion.
        /// </summary>
        /// <value>The real number part of the sedenion.</value>
        double RealPart { get; set; }

        /// <summary>
        /// Gets or sets the imaginary number parts in form of an array.
        /// </summary>
        /// <value>The imaginary number parts in form of an array.</value>
        double[] ImaginaryNumberParts { get; set; }

        /// <summary>
        /// Gets or sets the e1 part of the sedenion.
        /// </summary>
        /// <value>The e1 part of the sedenion.</value>
        double E1 { get; set; }

        /// <summary>
        /// Gets or sets the e2 part of the sedenion.
        /// </summary>
        /// <value>The e2 part of the sedenion.</value>
        double E2 { get; set; }

        /// <summary>
        /// Gets or sets the e3 part of the sedenion.
        /// </summary>
        /// <value>The e3 part of the sedenion.</value>
        double E3 { get; set; }

        /// <summary>
        /// Gets or sets the e4 part of the sedenion.
        /// </summary>
        /// <value>The e4 part of the sedenion.</value>
        double E4 { get; set; }

        /// <summary>
        /// Gets or sets the e5 part of the sedenion.
        /// </summary>
        /// <value>The e5 part of the sedenion.</value>
        double E5 { get; set; }

        /// <summary>
        /// Gets or sets the e6 part of the sedenion.
        /// </summary>
        /// <value>The e6 part of the sedenion.</value>
        double E6 { get; set; }

        /// <summary>
        /// Gets or sets the e7 part of the sedenion.
        /// </summary>
        /// <value>The e7 part of the sedenion.</value>
        double E7 { get; set; }

        /// <summary>
        /// Gets or sets the e8 part of the sedenion.
        /// </summary>
        /// <value>The e8 part of the sedenion.</value>
        double E8 { get; set; }

        /// <summary>
        /// Gets or sets the e9 part of the sedenion.
        /// </summary>
        /// <value>The e9 part of the sedenion.</value>
        double E9 { get; set; }

        /// <summary>
        /// Gets or sets the e10 part of the sedenion.
        /// </summary>
        /// <value>The e10 part of the sedenion.</value>
        double E10 { get; set; }

        /// <summary>
        /// Gets or sets the e11 part of the sedenion.
        /// </summary>
        /// <value>The e11 part of the sedenion.</value>
        double E11 { get; set; }

        /// <summary>
        /// Gets or sets the e12 part of the sedenion.
        /// </summary>
        /// <value>The e12 part of the sedenion.</value>
        double E12 { get; set; }

        /// <summary>
        /// Gets or sets the e13 part of the sedenion.
        /// </summary>
        /// <value>The e13 part of the sedenion.</value>
        double E13 { get; set; }

        /// <summary>
        /// Gets or sets the e14 part of the sedenion.
        /// </summary>
        /// <value>The e14 part of the sedenion.</value>
        double E14 { get; set; }

        /// <summary>
        /// Gets or sets the e15 part of the sedenion.
        /// </summary>
        /// <value>The e15 part of the sedenion.</value>
        double E15 { get; set; }

        /// <summary>
        /// Copies the current instance of an sedenion.
        /// </summary>
        /// <returns>The copy of the current instance.</returns>
        Sedenion Copy();

        /// <summary>
        /// Compares the current instance of a sedenion to another instance.
        /// </summary>
        /// <param name="compare">The sedenion to compare.</param>
        /// <returns>True if both sedenions are even otherwise, false.</returns>
        bool CompareTo(Sedenion compare);

        /// <summary>
        /// Powers the current sedenion raised to the specified power.
        /// </summary>
        /// <param name="value">The value to raised with.</param>
        /// <returns>The new sedenion raised to the specified power.</returns>
        Sedenion Pow(double value);
    }
}